using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Interfaces;
using HerGoS.DAO;
using System.Data;
using HerGoS.Administration.Engine;
using HerGoS.Documentos.Engine;
using HerGoS.Administration.Entities;
using HerGoS.Documentos.Exceptions;
using System.Globalization;
using HerGoS.Administration.Engine.Parametrizacion;

namespace HerGoS.Documentos.Entities
{
	public class GestorDocumentos
	{
		public static Documento Obtener(int oid)
		{
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "DOCUMENTOS_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", oid);
                DataTable dt = repo.ExecuteDataTable();
                Documento result = dt.ToGenericList<Documento>(DocumentoConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new DocumentoGetException(ex);
            }		
		}


        public static bool ExisteNumeroPorTipo (int numero,int tipoDocumento,int copia,int anio)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "DOCUMENTOS_SP";
                repo.AddParameter("@ACCION", "EXISTS");
                repo.AddParameter("@docNUMERO", numero);
                repo.AddParameter("@docANO", anio);
                repo.AddParameter("@docIDTIPODOCUMENTO", tipoDocumento);
                repo.AddParameter("@docCOPIA", copia);
                var result = repo.ExecuteScalar().ToInteger();

                return (result > 0);
            }
            catch (Exception ex)
            {
                throw new DocumentoGetException(ex);
            }
        }


        public static void Guardar(Documento documento)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryDocumentosName);
                repo.Nombre = "DOCUMENTOS_PROC";
                repo.AddParameter("@ACCION ",documento.Persistencia);
                repo.AddParameter("@ID", documento.OID);
                repo.AddParameter("@docIDTIPODOCUMENTO", documento.TipoDocumento == null ? (int?)null : documento.TipoDocumento.OID);
                repo.AddParameter("@IDENTIDADEMISORA", documento.Entidad == null ? (int?)null : documento.Entidad.OID);
                repo.AddParameter("@docIDPERSONAFIRMANTE", documento.PersonaFirmante == null ? (int?)null : documento.PersonaFirmante.OID);
		        repo.AddParameter("@docNUMERO", documento.Numero);
		        repo.AddParameter("@docANO", documento.Ano);
		        repo.AddParameter("@docCOPIA", documento.Copia);
                repo.AddParameter("@docIDLEGAJODOCUMENTOS", documento.LegajoDocumento == null ? (int?)null : documento.LegajoDocumento.OID);
		        repo.AddParameter("@docNUMEROEXTERNO", documento.NumeroExterno);
		        repo.AddParameter("@docFECHAEXTERNA", documento.FechaExterna);
                repo.AddParameter("@docIDTEMA", documento.Tema == null ? (int?)null : documento.Tema.OID);
		        repo.AddParameter("@docREFERENCIA", documento.Referencia);
		        repo.AddParameter("@docDESCRIPCION", documento.Descripcion);
                repo.AddParameter("@docIDMONEDA", documento.Moneda == null ? (int?)null : documento.Moneda.OID);
		        repo.AddParameter("@docIMPORTE", documento.Importe);
                repo.AddParameter("@docIDCLASE", documento.Clase.OID);
	        	repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                documento.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();

                GestorBitacora.Guardar(documento);
             
            }
            catch (Exception ex)
            {
                throw new DocumentoSaveException(ex);
            }
        }

        public static void Eliminar(Documento documento)
        {
            documento.Persistencia = EstadoPersistencia.DELETE;
            Guardar(documento);
            documento.Persistencia = EstadoPersistencia.UPDATE;
            documento.Activo = false;
        }


        public static void ReActivar(Documento documento)
        {
            documento.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(documento);
            documento.Persistencia = EstadoPersistencia.UPDATE;
            documento.Activo = true;
        }

        public static List<Documento> Consultar(DocumentoDTO documentoDTO)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "DOCUMENTOS_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@docIDTIPODOCUMENTO", documentoDTO.TipoDocumento == null ? (int?)null : documentoDTO.TipoDocumento.OID);
                repo.AddParameter("@IDENTIDADEMISORA", documentoDTO.Entidad == null ? (int?)null : documentoDTO.Entidad.OID);
                repo.AddParameter("@docIDPERSONAFIRMANTE", documentoDTO.PersonaFirmante == null ? (int?)null : documentoDTO.PersonaFirmante.OID);
                repo.AddParameter("@docNUMERO", documentoDTO.Numero == 0 ? (int?)null : documentoDTO.Numero);
                repo.AddParameter("@docANO", documentoDTO.Ano == 0 ? (int?)null : documentoDTO.Ano);
                repo.AddParameter("@docCOPIA", documentoDTO.Copia == 0 ? (int?)null : documentoDTO.Copia);
                repo.AddParameter("@docIDLEGAJODOCUMENTOS", documentoDTO.LegajoDocumento == null ? (int?)null : documentoDTO.LegajoDocumento.OID);
                repo.AddParameter("@docNUMEROEXTERNO", documentoDTO.NumeroExterno);
                repo.AddParameter("@docFECHAEXTERNA", documentoDTO.FechaExterna);
                repo.AddParameter("@docIDTEMA", documentoDTO.Tema == null ? (int?)null : documentoDTO.Tema.OID);
                repo.AddParameter("@docREFERENCIA", documentoDTO.Referencia);
                repo.AddParameter("@docDESCRIPCION", documentoDTO.Descripcion);
                repo.AddParameter("@docIDMONEDA", documentoDTO.Moneda == null ? (int?)null : documentoDTO.Moneda.OID);
                repo.AddParameter("@docIMPORTE", documentoDTO.Importe);
                repo.AddParameter("@ACTIVO", documentoDTO.Activo);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                DataTable dt = repo.ExecuteDataTable();
                List<Documento> result = dt.ToGenericList<Documento>(DocumentoConverter);
                return result;
             
            }
            catch (Exception ex)
            {
                throw new ProcesoGetException(ex);
            }
        }

        public static List<Documento> Consultar()
        {
           DocumentoDTO documentoDTO = new DocumentoDTO { Activo = true };
           return Consultar(documentoDTO);
        }

		
		#region Converter

        public static Documento DocumentoConverter(DataRow row)
        {
            Documento documento  =  new Documento
            {
				OID = row["docID"].ToInteger(),
				Persistencia = EstadoPersistencia.UPDATE,
                TipoDocumento = GestorTipoDocumentos.Obtener(row["docIDTIPODOCUMENTO"].ToInteger()) ?? null,
			    Entidad = GestorEntidades.Obtener(row["docIDENTIDADEMISORA"].ToInteger())?? null,
		        PersonaFirmante = GestorPersona.Obtener(row["docIDPERSONAFIRMANTE"].ToInteger()) ,
		        Numero = row["docNUMERO"].ToInteger(),
		        Ano = row["docANO"].ToInteger(),
		        Copia = row["docCOPIA"].ToInteger(),
		        LegajoDocumento = GestorLegajoDocumento.Obtener(row["docIDLEGAJODOCUMENTOS"].ToInteger()),
		        NumeroExterno = row["docNUMEROEXTERNO"].ToString(),
		        FechaExterna = row.IsNull("docFECHAEXTERNA") ? null : (DateTime?)row["docFECHAEXTERNA"].ToDateTime(),
                Tema = GestorTemas.Obtener(row["docIDTEMA"].ToInteger()),
		        Referencia = row["docREFERENCIA"].ToString(),
		        Descripcion = row["docDESCRIPCION"].ToString(),
		        Moneda = GestorTipoMoneda.Obtener(row["docIDMONEDA"].ToInteger()),
		        Importe = row["docIMPORTE"].ToDecimal(),
                Activo = row.IsNull("FECHA_BAJA") ? true : false,
                Clase = GestorClaseDocumentos.Obtener(row["docIDCLASE"].ToInteger())

            };

            return documento;
        }
        #endregion
	}
}